package com.example.javaxiangmu.service;

import com.example.javaxiangmu.entity.User;
import com.example.javaxiangmu.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户业务逻辑服务类
 * 
 * 负责处理用户相关的业务逻辑
 * 包含用户的增删改查操作，并进行数据验证和异常处理
 * 
 * @author Your Name
 * @version 1.0.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    /**
     * 创建新用户
     * 
     * @param user 用户对象
     * @return 创建成功的用户对象
     * @throws IllegalArgumentException 如果用户名或邮箱已存在
     */
    @Transactional
    public User createUser(User user) {
        log.info("开始创建用户，用户名: {}", user.getUsername());
        if (userRepository.existsByUsername(user.getUsername())) {
            log.warn("创建用户失败，用户名已存在: {}", user.getUsername());
            throw new IllegalArgumentException("用户名已存在");
        }
        if (userRepository.existsByEmail(user.getEmail())) {
            log.warn("创建用户失败，邮箱已被使用: {}", user.getEmail());
            throw new IllegalArgumentException("邮箱已被使用");
        }
        User savedUser = userRepository.save(user);
        log.info("用户创建成功，用户ID: {}, 用户名: {}", savedUser.getId(), savedUser.getUsername());
        return savedUser;
    }

    /**
     * 根据ID查询用户
     * 
     * @param id 用户ID
     * @return 用户对象
     * @throws IllegalArgumentException 如果用户不存在
     */
    public User getUserById(Long id) {
        log.debug("查询用户，用户ID: {}", id);
        User user = userRepository.findById(id)
                .orElseThrow(() -> {
                    log.warn("查询用户失败，用户ID不存在: {}", id);
                    return new IllegalArgumentException("用户不存在");
                });
        log.debug("查询用户成功，用户ID: {}, 用户名: {}", user.getId(), user.getUsername());
        return user;
    }

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 用户对象
     * @throws IllegalArgumentException 如果用户不存在
     */
    public User getUserByUsername(String username) {
        log.debug("根据用户名查询用户: {}", username);
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> {
                    log.warn("查询用户失败，用户名不存在: {}", username);
                    return new IllegalArgumentException("用户不存在");
                });
        log.debug("查询用户成功，用户名: {}, 用户ID: {}", username, user.getId());
        return user;
    }

    /**
     * 查询所有用户
     * 
     * @return 所有用户的列表
     */
    public List<User> getAllUsers() {
        log.debug("查询所有用户");
        List<User> users = userRepository.findAll();
        log.info("查询所有用户成功，共{}个用户", users.size());
        return users;
    }

    /**
     * 更新用户信息
     * 
     * @param id 用户ID
     * @param user 包含更新信息的用户对象
     * @return 更新后的用户对象
     * @throws IllegalArgumentException 如果用户不存在或用户名/邮箱已被使用
     */
    @Transactional
    public User updateUser(Long id, User user) {
        log.info("开始更新用户，用户ID: {}", id);
        User existingUser = getUserById(id);
        if (!existingUser.getUsername().equals(user.getUsername()) 
                && userRepository.existsByUsername(user.getUsername())) {
            log.warn("更新用户失败，用户名已存在: {}", user.getUsername());
            throw new IllegalArgumentException("用户名已存在");
        }
        if (!existingUser.getEmail().equals(user.getEmail()) 
                && userRepository.existsByEmail(user.getEmail())) {
            log.warn("更新用户失败，邮箱已被使用: {}", user.getEmail());
            throw new IllegalArgumentException("邮箱已被使用");
        }
        existingUser.setUsername(user.getUsername());
        existingUser.setEmail(user.getEmail());
        if (user.getPassword() != null && !user.getPassword().isEmpty()) {
            existingUser.setPassword(user.getPassword());
        }
        User updatedUser = userRepository.save(existingUser);
        log.info("用户更新成功，用户ID: {}, 用户名: {}", updatedUser.getId(), updatedUser.getUsername());
        return updatedUser;
    }

    /**
     * 删除用户
     * 
     * @param id 用户ID
     * @throws IllegalArgumentException 如果用户不存在
     */
    @Transactional
    public void deleteUser(Long id) {
        log.info("开始删除用户，用户ID: {}", id);
        if (!userRepository.existsById(id)) {
            log.warn("删除用户失败，用户ID不存在: {}", id);
            throw new IllegalArgumentException("用户不存在");
        }
        userRepository.deleteById(id);
        log.info("用户删除成功，用户ID: {}", id);
    }
}

